package exception

import (
	"exercise/application/yiran/app/libs"
	"github.com/gin-gonic/gin"
	"runtime/debug"
)

// Recover 全局异常管理
func Recover() func(ctx *gin.Context) {
	return func(ctx *gin.Context) {
		defer func() {
			if err := recover(); err != nil {
				//todo 记录日志
				libs.ServiceException(ctx, errorToString(err), string(debug.Stack()))
				return
			}
			//程序中断
			ctx.Abort()
		}()
		//程序继续
		ctx.Next()
	}
}

// errorToString 异常错误转成字符串
func errorToString(r interface{}) string {
	switch v := r.(type) {
	case error:
		return v.Error()
	default:
		return r.(string)
	}
}

func RecoverV2(ctx *gin.Context) {
	defer func() {
		if err := recover(); err != nil {
			//TODO 记录日志
			libs.ServiceException(ctx, errorToString(err), string(debug.Stack()))
			return
		}
		//程序中断
		ctx.Abort()
	}()
	//程序继续
	ctx.Next()
}
